package a1_2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 学院类（组合整体）：控制 Course 的创建、删除、访问
 */
public class College {
    private final String collegeName;

    // 聚合关系：建筑（可独立存在，外部可创建后传入）
    private final List<Building> buildings = new ArrayList<>();

    // 组合关系：课程（不可独立，仅内部管理）
    private final List<Course> courses = new ArrayList<>();

    // 整体的构造器（独立创建）
    public College(String collegeName) {
        this.collegeName = collegeName;
    }

    // ------------------------------
    // 聚合关系操作（建筑可独立，外部传入）
    // ------------------------------
    public void addBuilding(Building building) {
        if (building != null) {
            buildings.add(building);
        }
    }

    public void removeBuilding(Building building) {
        buildings.remove(building);
        // 建筑可独立存在，删除后仍可被其他对象引用
    }

    // ------------------------------
    // 组合关系操作（课程不可独立，内部创建）
    // ------------------------------
    /**
     * 创建并添加课程（外部唯一创建 Course 的途径）
     * 体现：Course 必须通过 College 创建，绑定当前 College
     */
    public Course addCourse(String courseId, String courseName, Building location) {
        // 校验：建筑必须属于当前学院（满足实验A1-2的约束）
        if (!buildings.contains(location)) {
            throw new IllegalArgumentException("Course location must be a building of this college");
        }

        // 2. 通过 Course 的静态工厂方法创建实例（绑定当前 College）
        Course course = Course.createCourse(courseId, courseName, location, this);
        courses.add(course);
        return course; // 返回只读视图，外部无法修改
    }

    /**
     * 删除课程（外部唯一删除 Course 的途径）
     * 体现：Course 随 College 控制销毁，删除后无外部引用
     */
    public boolean removeCourse(Course course) {
        if (course == null || !courses.contains(course)) {
            return false;
        }
        // 校验：只能删除属于当前 College 的课程
        if (course.getCollege() != this) {
            throw new IllegalArgumentException("Course does not belong to this college");
        }
        return courses.remove(course);
        // 删除后，外部无任何引用（因无法独立创建），Course 会被垃圾回收
    }

    // ------------------------------
    // 访问控制（禁止外部修改部分）
    // ------------------------------
    /**
     * 返回不可修改的课程列表（只读视图）
     * 体现：外部只能查询，不能直接操作 Course 列表
     */
    public List<Course> getCourses() {
        return Collections.unmodifiableList(courses);
    }

    public List<Building> getBuildings() {
        return Collections.unmodifiableList(buildings);
    }

    // Getter（整体属性）
    public String getCollegeName() {
        return collegeName;
    }
}